// todo: 管理基于 token 的授权拦截器，检查当前token是否过期，并且在每次发起请求是会自动发起token
import 'package:dio/dio.dart';
import 'package:jwt_decoder/jwt_decoder.dart';

const String _kTokenKey = 'Authorization';
const String _kTokenPrefix = 'Bearer ';

/// 自定义 Token 拦截器，检查并管理 Token 的有效性
class TokenInterceptor extends InterceptorsWrapper {
  String _token;

  /// token 失效时的回调
  final Future<String> Function()? onTokenRefresh;

  TokenInterceptor({
    required String token,
    this.onTokenRefresh,
  }) : _token = token;

  /// 更新当前的 Token
  void updateToken(String newToken) {
    _token = newToken;
  }

  @override
  void onRequest(
      RequestOptions options, RequestInterceptorHandler handler) async {
    // 检查 token 是否有效
    if (_token.isNotEmpty && JwtDecoder.isExpired(_token)) {
      if (onTokenRefresh != null) {
        try {
          // 调用回调以刷新 token
          final newToken = await onTokenRefresh!();
          updateToken(newToken);
        } catch (error) {
          // Token 刷新失败时可以记录日志或抛出异常
          handler.reject(DioException(
            requestOptions: options,
            error: 'Token 刷新失败: $error',
          ));
          return;
        }
      } else {
        handler.reject(DioException(
          requestOptions: options,
          error: 'Token 已过期且没有刷新机制',
        ));
        return;
      }
    }

    // 在请求头中设置新的 token
    if (_token.isNotEmpty) {
      options.headers[_kTokenKey] = '$_kTokenPrefix$_token';
    }

    handler.next(options); // 继续请求处理
  }
}
